package common

import (
	"github.com/360EntSecGroup-Skylar/excelize"
	"github.com/DangoXJ/secbinarycheck-result-analyzer/logger"
	"go.uber.org/zap"
	"io/ioutil"
	"os"
	"strings"
)

var log *zap.Logger

func init() {
	log = logger.GetLogger("COMM")
}

type Base interface {
	AnalyseFromFile(filename string, baselines map[string]map[string]string) [][]string
	NewOriginalFile() *excelize.File
	UpdateSummaryFile(f *excelize.File, rows [][]string)
}

func AnalyseFromDir(b Base, dirname string, baselines map[string]map[string]string) {
	var retRows [][]string

	log.Info("开始分析目录下的扫描结果", zap.String("dirname", dirname))

	dir, err := ioutil.ReadDir(dirname)
	if err != nil {
		log.Panic(err.Error())
	}

	for _, fi := range dir {
		if fi.IsDir() { // 目录, 不处理
			continue
		} else {
			// 过滤指定格式
			ok := strings.HasSuffix(fi.Name(), ".xlsx") && !strings.HasSuffix(fi.Name(), "_分析结果.xlsx")
			if ok {
				filename := dirname + string(os.PathSeparator) + fi.Name()
				retRows = append(b.AnalyseFromFile(filename, baselines), retRows...)
			} else {
				log.Info("忽略文件", zap.String("FileName", fi.Name()))
			}
		}
	}

	if len(retRows) > 0 {
		GenSummaryFile(b, dirname, retRows)
	} else {
		log.Info("分析完成，所有问题均有结论")
	}
}

// 生成汇总文件，无须继承
func GenSummaryFile(b Base, dirname string, rows [][]string) {
	filename := dirname + string(os.PathSeparator) + "汇总_分析结果.xlsx"
	log.Info("分析完成，汇总分析结果", zap.String("Path", filename))
	f := b.NewOriginalFile()
	if f == nil {
		log.Error("创建文件失败")
		return
	}
	b.UpdateSummaryFile(f, rows)
	err := f.SaveAs(filename)
	if err != nil {
		log.Error("文件保存失败", zap.String("filename", filename))
	}
}

//
////// AnalyseFromFile 分析单个文件，需要继承
//func (c *Comm) AnalyseFromFile(filename string, baselines map[string]map[string]string)[][]string {
//	c.Logger.Info("开始分析文件", zap.String("dirname", filename),
//		zap.Int("baselines", len(baselines)))
//	return [][]string{[]string{"Test"},}
//}
//
//// 生成新的结果文件，需要继承
//func (c *Comm) NewOriginalFile() *excelize.File {
//	c.Logger.Info("生成汇总文件")
//	return excelize.NewFile()
//}
//
//// 更新结果文件，需要继承
//func (c *Comm) UpdateSummaryFile(f *excelize.File, rows [][]string) {
//	c.Logger.Info("更新汇总文件", zap.Any("f", f), zap.Int("len", len(rows)))
//}
